/**
 * 时间：2024-08-25
 * 作者：waygc
 * 描述：工具类
 *
 */
import { message } from 'antd';
import dayjs from 'dayjs';
import { useLocation, useNavigate, useParams } from "react-router-dom";

/**
 * List 转 Map 的处理
 * @param {*} list 
 * @returns 
 */
export const selectListToMap	= (list) => {
	const output = {};
	list.map(obj => {
		output[obj.value] = obj.label;
	});

	return output;
}

/**
 * 检查数字是否为空，在对象的基础上加上 isNaN 判断
 * @param {*} input 
 * @returns 
 */
export const checkNumberIsNotEmpty = (input) => {
	if (checkObjectIsNotEmpty(input)) {
	return !isNaN(input);
	} else {
	return false;
	}
}

/**
 * 检查数字是否为空，包括 undefined、null、[]、{}
 * @param {*} input 
 * @returns 
 */
export const checkObjectIsNotEmpty = (input) => {
	// 先去除掉 null、undefined、[]、""
	if (input === null || input === undefined) {
	return false;
	} else if (Array.isArray(input)) {
	return input.length > 0;
	} else if ( typeof(input) === "string") {
	return input.length > 0;
	} else if (typeof(input) === "object") {
	const keys = Object.keys(input);
	return keys.length > 0;
	} else {
	return true;
	}
}

export const normFile = (e) => {
	if (Array.isArray(e)) {
	return e;
	}
	return e?.fileList;
};

/**
 * 模拟文件处理的过程
 * @param {*} img 
 * @param {*} callback 
 */
export const getBase64 = (file, callback) => {
	const reader = new FileReader();
	reader.addEventListener('load', () => callback(reader.result));
	reader.readAsDataURL(file);
};

/**
 * 文件上传前检查
 * @param {*} file react 框架获得的文件
 * @param {*} fileTypes 错误类型的列表
 * @param {*} errMessage 错误类型的信息
 * @param {*} fileSize 文件大小（单位：M）
 * @returns 
 */
export const beforeUpload = (file, fileTypes, errMessage, fileSize) => {
	const notInType = fileTypes.indexOf(file.type) < 0;
	if (notInType) {
		message.error(errMessage);
	}
	const isLt2M = file.size / 1024 / 1024 < fileSize;
	if (!isLt2M) {
		message.error(`文件大小请控制在 ${fileSize}MB 以内`);
	}
	return !notInType && isLt2M;
}

/**
 * 停止 Ant Design 框架中 Upload 等组件自动上传
 * @returns 
 */
export const stopAutoUpload = () => {
	return false;
}

/**
 * 日期格式化
 * @param {*} date 
 * @param {*} formatter 
 * @returns 
 */
export const formatTime = (date, formatter = "YYYY-MM-DD HH:mm:ss")=> {
	return dayjs(date).format(formatter);
}

/**
 * React Class 转换为函数形式
 * 因为 react-router-dom 升级为了 v6，所以旧代码的格式无法兼容，需要一个中间转换层，所以这个函数就出现了
 * 参考：https://blog.csdn.net/qq_36651686/article/details/123334937
 * @param {*} Component 
 * @returns 
 */
export const withRouter = (Component) => {
	function ComponentWithRouterProp(props) {
	let location = useLocation();
	let navigate = useNavigate();
	let params = useParams();
	return (
		<Component
		{...props}
		router={{ location, navigate, params }}
		/>
	);
	}

	return ComponentWithRouterProp;
}

export default {
	selectListToMap,
	checkObjectIsNotEmpty,
	checkNumberIsNotEmpty,
	getBase64,
	beforeUpload,
	stopAutoUpload,
	formatTime,
	normFile,
	withRouter
}
